React第二讲课堂笔记(JSX 语法)

1. 什么是 JSX

类似 xml 的语法,用来描述组件树

1
2
3
4
5
6
7
var HelloMessage = React.createClass({
render: function() {
return <div>Hello {this.props.name}</div>;
}
});

React.render(<HelloMessage name="John" />, mountNode);

JSX是可选的,并不强制要求使用。如果不用JSX,用React提供的API写的话,应该是这样的,直接调用React的API来定义组件和DOM元素。

1
2
3
4
5
6
7
8
9

var HelloMessage = React.createClass({
displayName: "HelloMessage",
render: function() {
return React.createElement("div", null, "Hello ", this.props.name);
}
});

React.render(React.createElement(HelloMessage, {name: "John"}), mountNode);

2. 为什么要使用 JSX

你不需要为了 React 使用 JSX,可以直接使用纯粹的 JS。但我们更建议使用 JSX , 因为它能定义简洁且我们熟知的包含属性的树状结构语法。

3. 注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React, { Component } from 'react';

const name = 'yongfeng';
const MyComponent = () => {
<Nav>
{/* 一般注释, 用 {} 包围 */}
<a
/* 多

注释 */
className={ name ? 'a' : 'b' } // 行尾注释
href="http://guoyongfeng.github.io/idoc"
> 注释 </a>
</Nav>
};

export default MyComponent;

4. 命名

1
2
3
4
5
6
7
8
9
10
import React, { Component } from 'react';

// 1. 组件命名遵循驼峰命名,首字母大写
class ComponentDemo extends Component {
render(){
return <div> 你好,兄弟... </div>
}
}

export default ComponentDemo;

5. 根元素个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React, { Component } from 'react';

class ComponentDemo extends Component {
render(){
// 以下写法直接报错
return (
<div>
hello
</div>
<h1> hello h1 </h1>
);
}
}

export default ComponentDemo;

React只有一个限制, 组件只能渲染单个根节点。如果你想要返回多个节点,它们必须被包含在同一个节点里。

6. 嵌入变量

{}花括号内可以写JS逻辑,表达式和方法定义都可以

1
let person = <Person name={window.isLoggedIn ? window.name : ''} />;

7. styles

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React, { Component } from 'react';

class StyleDemo extends Component {
render(){
// 5. 在JS文件里面给组件定义样式
var MyComponentStyles = {
color: 'blue',
fontSize: '28px'
};

return (
<div style={MyComponentStyles}>
可以直接这样写行内样式
</div>
)
}
}

export default StyleDemo;

8. JSX SPREAD

可以通过 {...obj} 来批量设置一个对象的键值对到组件的属性

1
2
3
4
5
6
7
8
9
10
11
12
import React, { Component } from 'react';

class SpreadDemo extends Component {
componentWillMount(){
console.log(this.props);
}
render(){
return <h1> {this.props.name} is a {this.props.type} </h1>;
}
}

export default SpreadDemo;

9. 属性名不能和 js 关键字冲突

例如:className readOnly htmlfor